package basicx.oop.classx

/*-*- coding:utf-8 -*-
* @Author  : ygree 
* @Time    : 2021/7/6 14:57
* @Software : IntelliJ IDEA
*/

/**
 * 数据类,是专门设计用来存储数据的类
数据类提供了toString的个性化实现
==符号默认情况下，比较对象就是比较它们的引用值，数据类提供了equals和hash
Code的个性化实现
 */
data class DataClass(var x: Int, var y: Int) {
    var isInBounds = x > 0 && y > 0
}

private fun data() {
//    DataClass自动重写了 toString hashCode 函数
    val dataClass = DataClass(12, 32)
    val dataClass2 = DataClass(12, 32)
    val dataClassCopy = DataClass(12, 32).copy()
    println(dataClass)//@7cca494b-->DataClass(x=12, y=32)
    println("${dataClass == dataClass2} ${dataClass === dataClass2}")  //true false
    println("${dataClass == dataClassCopy} ${dataClass === dataClassCopy}") //true false
    println("---------------")
    val (x, y) = DataClass(12, 45)//数据类直接支持 （自带）解构语法
    println("$x,$y")
}

/**除了重写Any类的部分函数，提供更好用的默认实现外，数据类还提供了一个函数，它可以用来方便地复制一个对象。假设你想创建一个Student实例，
 * 除了name属性，它拥有和另一个现有Student实例完全一样的属性值，
 * 如果Student是个数据类，那么复制现有Student实例就很简单了，只要调用copy函数，给想修改的属性传入值参就可以了。
 */

data class StudentCopy(var name: String, val age: Int) {
    constructor (_name: String) : this(_name, 12)
    override fun toString(): String {
        return "StudentCopy(name='$name', age='$age')"
    }
}

private fun copy() {
    val sc = StudentCopy("jack", 10)
    val copy = sc.copy("Rose")//只有name属性变化
//    copy没有使用次构造,会导致与 普通创建对象 结果不同,.需要再次赋值
    println(sc)
    println(copy)
}

private fun main(args: Array<String>) {
    data()
    copy()

}
